<!DOCTYPE html>
<html lang="en">

<head>
  <meta charset="UTF-8">
  <meta http-equiv="X-UA-Compatible" content="IE=edge">
  <meta name="viewport" content="width=device-width, initial-scale=1.0">
  <title>Document</title>
</head>

<body>

</body>
<script>
  // 递归 => 函数在执行过程中调用了自身,称为递归调用

  // 特点: 类似循环 重复的执行函数中的代码段

  // 注意: 递归一定要有跳出条件(临界值) => 满足条件时递归,不满足条件时 跳出


  // 需求： 计算1-100的和

  // 对比死循环   => 循环可以依靠break停止
  // var i = 1;
  // var sum = 0;
  // while(true){
  //     console.log("hello everyone!",i);
  //     sum += i;
  //     if(i>=100){
  //         break;
  //     }
  //     i++;
  // }

  // 对比递归   =>  递归可以依靠return终止
  // var i = 1;
  // var sum = 0;
  // function fn(){
  //     console.log("hello everyone!",i);
  //     sum += i;
  //     if(i>=100){
  //         return false;
  //     }
  //     i++;
  //     fn();
  // }
  // fn();
  // console.log(sum);

  // debugger;
  // 升级版_提形参
  // function fn(i,sum){ //i =  99 
  //     // debugger;
  //     // i=1,sum=0   
  //     // i=2,sum=1   
  //     console.log("hello everyone!",i);
  //     sum += i;
  //     if(i>=100){ // 跳出条件
  //         return sum;
  //     }
  //     i++;
  //     return fn(i,sum);   // fn(100)  =>  5050
  // }
  // // fn(1) => fn(2) ..... fn(99) => fn(100)
  // //                                  ||
  // //                                 5050

  // var result = fn(1,0);
  // console.log(result);


  // 1-100    100 => 1


  // 尾递归  => 在临界位置得出最终结果 并依次向回传递
  function fn(i, sum) {
    sum += i;
    if (i <= 1) { // 跳出条件
      return sum;
    }
    i--;
    return fn(i, sum);   // fn(100)  =>  5050
  }
  var result = fn(5, 0);
  console.log(result);

  // fn(5,0) =>  i= 5,sum = 0 =>  sum+=i(0+5);          i-- => fn(4,5)
  // fn(4,5) =>  i= 4,sum = 5 =>  sum+=i(5+4);          i-- => fn(3,9)
  // fn(3,9) =>  i= 3,sum = 9 =>  sum+=i(5+4+3);        i-- => fn(2,12)
  // fn(2,12) =>  i= 2,sum = 12 =>  sum+=i(5+4+3+2);    i-- => fn(1,14)
  // fn(1,14) =>  i= 1,sum = 14 =>  sum+=i(5+4+3+2+1);    return sum;


  // 递归 => 先传递,再回归
  // fn(5,0) => fn(4,5) =>  fn(3,9) =>  fn(2,12) => fn(1,14)
  //                                                   ||           
  //     15  <=    15  <=      15   <=      15  <=    15

  // 买6元皮肤
  // 我  =>  同桌A  =>  同桌B  => 同桌C   => 同桌D
  //                                         ||
  // 6        6          6        6          6



</script>

</html>